//
//  main.m
//  OC03_属性_点语法
//
//  Created by dllo on 16/2/26.
//  Copyright © 2016年 Apon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Fraction.h"




int main(int argc, const char * argv[]) {
#pragma mark - 知识点1. 属性
        
/** 
 * 属性实现了三个功能: 1. 声明了一个实例变量.
                    2. 声明了setter, getter方法.
                    3. 实现了setter, getter方法.
 *
 * 详见Person 类文件.
 */
    
#if 0
    //创建person对象
    Person *per = [Person person];
    
    //实例变量赋值, setter方法是属性自动实现的.
    [per setName:@"Tom"];
    [per setSex:@"male"];
    [per setAge:20];
    
    // 实例变量取值, getter方法是属性自动实现的.
    NSLog(@"name:%@, sex:%@, age:%ld", [per name], [per sex], [per age]);
    
#endif
    
    
#pragma mark - 知识点2. 属性的特性
/** 
 * 属性的特性有3个, 读写性, 原子性, 语义设置.
 * 属性的特性的目的是: 控制setter, getter方法实现的细节.
 *
 * 读写性特性的选项: readonly, readwrite, setter= , getter=.
                  默认是 readwrite.
                  常用是 readwrite.
 *
 * 原子性特性的选项: atomic, nonatomic.
                  默认是 atomic.
                  常用是 nonatomic.
 
 *
 * 语义设置特性的选项: assign, retain, copy.
                  默认是 assign.
                  非对象类型(int NSIntger)使用 assign.
                  对象类型(NSString)使用 retain.
                  对象类型并且想获取副本使用 copy.
 *
 * 详见 Person.h 文件.
 */
    
    
#pragma mark - 知识点3. 点语法
/** 
 * 点语法只试用于 setter, getter 方法.
 */
    
    // 创建对象.
    Person *per1 = [Person person];
    
    //点语法对属性进行赋值.
    per1.name = @"Tom";
    per1.sex = @"male";
    per1.age = 20;
    
    // 点语法对属性取值.
    NSLog(@"name:%@, sex:%@, age:%ld", per1.name, per1.sex, per1.age);
    
    Person *per2 = [Person person];
    
    per2.name = per1.name;
    
    
#pragma mark - 综合练习(分数)
    /**
     * 创建一个Fraction类(分数)实现分数的加减乘除, ⽐较⼤小、约分(辗转相除法)等方法。
     * 提示：
     * 1.声明属性 numerator(分子)、denominator(分母)。
     * 2.声明自定义初始化方法、遍历构造器，用于给分子分母赋值。
     * 3.声明功能方法
     */
    
    // 创建分数对象.
    Fraction *frac1 = [Fraction fractionWithNumerator:2 denominator:3];
    
    Fraction *frac2 = [Fraction fractionWithNumerator:1 denominator:2];
    
    
    // 调用加方法.
    Fraction *frac3 = [frac1 plusWithFraction:frac2];
    
    NSLog(@"sum:%@", frac3);
    NSLog(@"sum = %ld/%ld", frac3.numerator, frac3.denominator);
    
    
    
    
    
    
    
    
    
    
    
    
    
    return 0;
}
